//导入相关模块，本文以登陆功能为例,带参请求http://localhost:8088/user/login?name=yourval&password=yourval
const { pool, router, resJson } = require('../connect')
const userSQL = require('../db/userSQL')
const stringRandom = require('string-random'); // 生成随机数，用于登录验证
const NodeRSA = require("node-rsa")//引入node-rsa，解密使用
const { _publicKey, _priKey } = require('../utils/keys')
 /**
 * 登录
 */
router.post('/login', (req, res) => {   //本地接口路径http://localhost:8088/user/login
  let user = {
    username: req.body.username,
    password: req.body.password
  }
  const privateKey = new NodeRSA(_priKey) // 使用node-rsa
  privateKey.setOptions({ encryptionScheme: "pkcs1" }) // 因为vue中使用jsencrypt，jsencrypt自身使用的是pkcs1加密方案, nodejs需要修改成pkcs1
  var password = privateKey.decrypt(user.password, "utf8")
  let _res = res;
  console.log('处理登录请求')
  // 判断参数是否为空
  if (!user.username) {
    return resJson(_res, {
        code: -1,
        msg: '用户名不能为空'
    })
  }
  if (!user.password) {
    return resJson(_res, {
        code: -1,
        msg: '密码不能为空'
    })
  }

  let _data;
  const sessran = stringRandom(36, { numbers: true })
  var usersess = req.session;
  // 从连接池获取连接
  pool.getConnection((err, conn) => { //数据库链接
    conn.query(userSQL.queryByNamePassword, [user.username], (e, result) => { //操作数据库
        if (e) _data = {
            code: -1,
            msg: e
        }
        //通过用户名和密码索引查询数据，有数据说明用户存在且密码正确，只能返回登录成功，否则返回用户名不存在或登录密码错误
        // console.log('结果',result)
        // console.log(privateKey.decrypt(result[0]['password'], "utf8"),password)
        if (result && result.length && privateKey.decrypt(result[0]['password'], "utf8") === password) {
            _data = {
                code:0,
                msg: '登录成功',
                data: {
                    session: sessran,
                    userInfo: result[0]
                }
            }
            req.session.userinfo = sessran; // 设置session
            req.session.islogin = true // 用户的登录状态
            console.log('设置session',req.session)
            resJson(_res, _data)
        } else {
            _data = {
                code: -1,
                msg: '用户名不存在或登录密码错误'
            }
            resJson(_res, _data)
        }
    })
    pool.releaseConnection(conn) // 释放连接池，等待别的连接使用
  })
})

 /**
 * 注册
 */
router.post('/registry',(req,res) => {
    let user = {
        username: req.body.username,
        password: req.body.password
    }
    let _res = res;

    // 判断参数是否为空
    if (!user.username) {
        return resJson(_res, {
            code: -1,
            msg: '用户名不能为空'
        })
    }
    if (!user.password) {
        return resJson(_res, {
            code: -1,
            msg: '密码不能为空'
        })
    }
    // 从连接池获取连接
  pool.getConnection((err, conn) => { //数据库链接
    conn.query(userSQL.queryByUsername,[user.username],(e,result)=>{
        if(e) return  res.send(//执行SQL语句失败
        {
            code:-1,
            msg:e.message
        })
        if(result.length>0){
            return  res.send(//select查询的结果是数组,用户名被占用
            {
                code:-1,
                msg:'用户名被占用，请更换用户名'
            })
        } else {
            // const publickKey = new NodeRSA(_publicKey, { encryptionScheme: 'pkcs1' });
            // const encCode = publickKey.encrypt(user.password, 'base64');
            conn.query(userSQL.registryUser, [user.username, user.password], (e, result) => { //操作数据库
                if (e) _data = {
                    code: -1,
                    msg: e
                }
                console.log(e,result)
                if (result) {
                    _data = {
                        msg: '注册成功',
                        data: null,
                        code: 0
                    }
                } else {
                    _data = {
                        code: -1,
                        msg: '用户名不存在或登录密码错误'
                    }
                }
                setTimeout(() => {
                    //把操作结果返回给前台页面
                    resJson(_res, _data)
                }, 500);
            })
        }

    })
    pool.releaseConnection(conn) // 释放连接池，等待别的连接使用
  })

})

// 退出登录的接口
router.get('/logout', (req, res) => {
    console.log('登出系统', req.session)
    // TODO_04：清空 Session 信息
    req.session.destroy()
    res.send({
      code: 0,
      msg: '登出成功',
    })
})

module.exports = router;

